#pragma once

#include <string>
#include <vector>
#include <map>

using std::string;

namespace louis {
    namespace json {

    class Json
    {
    public:
        enum Type
        {
            json_null = 0,  // < 'null' value
            json_bool,      // < bool value
            json_int,       // < integer value
            json_double,    // < double value
            json_string,    // < UTF-8 string value
            json_array,     // < array value (ordered list)
            json_object     // < object value (collection of name/value pairs).
        };

        Json();
        Json(bool value);
        Json(int value);
        Json(double value);
        Json(const char * value);
        Json(const string & value);
        Json(Type type);
        Json(const Json & other);

        operator bool();
        operator int();
        operator double();
        operator string();

        Json & operator [] (int index);
        void append(const Json & other);

    private:
        union Value
        {
            bool m_bool;
            int m_int;
            double m_double;
            string * m_string;
            std::vector<Json> * m_array;
            std::map<string, Json> * m_object;
        };

        Type m_type;
        Value m_value;
    };
}}